/*
 * SIGCLD是一个非常重要的信号。当一个子进程退出时，并不是立即释放其占用的资源，而是通知其父进程，
 * 由父进程进行后续的工作。在这一过程中，系统将依次产生下列事件。
 *
 * 1）向父进程发送SIGCLD信号，子进程进入zombie（僵尸）状态。
 *
 * 2）父进程接收到SIGCLD信号，进行处理。
 *
 * example:捕获SIGCLD信号，输出各子进程的ID和退出状态码
 *
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <pthread.h> 
#include <unistd.h>	/* fork() sleep() */

//SIGCLD信号处理函数
void CbSigCld(int signo)
{
  //保存退出进程的ID
  int pid;
  //保存退出进程的退出状态码
  int status;
  //等待任何一个子进程退出
  pid=waitpid(-1,&status,0);
  //输出退出的子进程ID和退出代码
  printf("Child process %d exit with status %d\n",pid,status);
}

void main()
{
  int i,pid;
  //安装SIGCLD信号
  if(signal(SIGCLD,CbSigCld)==SIG_ERR)
    {
      perror("signal");
      return;
    }
  //循环创建子进程
  for(i=0;i<5;i++)
    {
      pid=fork();
      //如果是子进程
      if(pid==0)
	{
	  //退出子进程，退出状态码为0
	  exit(0);
	}
      //如果是父进程
      else
	{
	  sleep(1);
	}
    }
}

